package es.efor.ics.gev.model;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

/**
 * Estado de una fase en un evento
 * 
 * @see Evento
 * @see Fase
 * @see EstadoFase
 */
@Entity
@Table(name = "VAL_ESTADOS_FASES")
public class ValorEstadoFase extends BaseObject implements Serializable {

	/**
	 * Embedded composite identifier class that represents the primary key
	 * columns of the many-to-many join table.
	 */
	@Embeddable
	public static class Id implements Serializable {
		private static final long serialVersionUID = -1536218358248723310L;
		
		private Long eventoId;
		private Long faseId;		
		
		public Id() {			
		}
		
		public Id(Long eventoId, Long faseId) {		
			this.eventoId = eventoId;
			this.faseId = faseId;			
		}
		
		@Column(name = "EVENTO_ID")
		public Long getEventoId() {
			return eventoId;
		}

		public void setEventoId(Long eventoId) {
			this.eventoId = eventoId;
		}

		@Column(name = "FASE_ID")
		public Long getFaseId() {
			return faseId;
		}
		
		public void setFaseId(Long faseId) {
			this.faseId = faseId;
		}
		
		@Override
		public boolean equals(Object o) {
			if (o instanceof Id) {
				Id that = (Id) o;
				return this.getEventoId().equals(that.getEventoId())
						&& this.getFaseId().equals(that.getFaseId());
			} else {
				return false;
			}
		}
		
		@Override
		public int hashCode() {			
			return getEventoId().hashCode() + getFaseId().hashCode();
		}			
		
	}
		
	//static data
	private static final long serialVersionUID = 4245647750974497298L;

	// private instance data
	private Id id;
	private Evento evento;
	private Fase fase;
	private EstadoFase estadoFase;	
	
	/**
	 * Construct an uninitialized <code>ValorEstadoFase</code>.
	 */
	public ValorEstadoFase() {		
	}
		
	/**
	 * Construct an uninitialized <code>ValorEstadoFase</code>.
	 * 
	 * @param evento
	 * @param fase
	 * @param estadoFase
	 */
	public ValorEstadoFase(Evento evento, Fase fase, EstadoFase estadoFase) {		
		this.evento = evento;
		this.fase = fase;
		this.estadoFase = estadoFase;
		
		// Set primary key
		this.id = new Id(evento.getId(), fase.getId());
	}

	// ********************** Accessor Methods ********************** //
	
	@EmbeddedId
	public Id getId() {
		return id;
	}

	public void setId(Id id) {
		this.id = id;
	}	
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "EVENTO_ID", insertable = false, updatable = false)
	@org.hibernate.annotations.ForeignKey(name = "FK_VAL_EST_FASE_EVENTO_ID")
	public Evento getEvento() {
		return evento;
	}
	
	public void setEvento(Evento evento) {
		this.evento = evento;
	}
			
	@ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "FASE_ID", insertable = false, updatable = false)
    @org.hibernate.annotations.ForeignKey(name = "FK_VAL_EST_FASE_FASE_ID")	
	public Fase getFase() {
		return fase;
	}

	public void setFase(Fase fase) {
		this.fase = fase;
	}
	
    @Enumerated
    @Column(name = "ESTADO_FASE", nullable=false)
	public EstadoFase getEstadoFase() {
		return estadoFase;
	}

	public void setEstadoFase(EstadoFase estadoFase) {
		this.estadoFase = estadoFase;
	}
		
	// ********************** Common Methods ********************** //
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null || getClass() != obj.getClass()) {
			return false;
		}
		ValorEstadoFase rhs = (ValorEstadoFase) obj;
		return id.equals(rhs.id);
	}

	@Override
	public int hashCode() {
		return id.hashCode();
	}

	@Override
	public String toString() {
		return new ToStringBuilder(this, ToStringStyle.DEFAULT_STYLE).
		append("evento", this.getEvento().getNumAtributosAccionInformados()).
		append("fase", this.getFase().getNombreFase()).
		append("estado", this.getEstadoFase().getValue()).		
		toString();
	}

}
